package com.forum.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.forum.bean.UserProfiles;
import com.forum.bean.Users;
import com.forum.common.Result;
import com.forum.dto.*;
import com.forum.mapper.ArticleLikeMapper;
import com.forum.mapper.UsersMapper;
import com.forum.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/user")
public class UserController {
    @Autowired
    private UsersService userService;
    @Autowired
    private UsersMapper usersMapper;
    @Autowired
    private UsersService usersService;


    /**
     * 请求 JSON 示例：
     * {
     *   "username": "testUser",
     *   "password": "123456",
     *   "email": "test@example.com",
     *   "avatar": "avatar.jpg",
     *   "bio": "这是我的简介"
     * }
     */
    @PostMapping("/register")
    public Result<Users> register(@RequestBody RegistrationRequest req) {
        return userService.register(req);
    }


    /**
     * 充值接口
     * 请求 JSON 示例：
     * {
     *   "userId": 1,
     *   "amount": 100.0
     * }
     */
    @PostMapping("/recharge")
    public Result<UserProfiles> recharge(@RequestBody RechargeRequest request) {
        return userService.recharge(request);
    }

    /**
     * 修改密码接口：接收 JSON 格式参数 { "userId": 1, "oldPassword": "123", "newPassword": "456" }
     */
    @PostMapping("/changePassword")
    public Result<String> changePassword(@RequestBody ChangePasswordRequest req) {
        return userService.changePassword(req);
    }



    /**
     * 修改个人信息接口
     * 请求体示例：
     * {
     *   "userId": 1,
     *   "username": "新用户名",
     *   "email": "new@example.com",
     *   "avatar": "avatar.jpg",
     *   "bio": "这是我的个人简介"
     * }
     */
    @PostMapping("/update")
    public Result<String> updateProfile(@RequestBody UpdateProfileRequest request) {
        return userService.updateProfile(request);
    }


    /**
     * 查询用户详细信息接口，返回包括头像、用户名、简介、状态、余额、注册日期、邮箱、最后登录时间，
     * 文章数、粉丝数、点赞数、关注数。
     */
    @GetMapping("/detail")
    public Result<UserDetailDto> getUserDetail(@RequestParam("userId") Integer userId,
                                               @RequestParam("currentUserId") Integer currentUserId) {
        return userService.getUserDetail(userId, currentUserId);
    }



    /**
     * 登录接口，传入邮箱和密码，返回 JWT Token
     * 请求示例：
     * {
     *   "email": "user@example.com",
     *   "password": "123456"
     * }
     */
    @PostMapping("/login")
    public Result<LoginResponse> login(@RequestBody LoginRequest request) {
        return userService.login(request);
    }


    /**
     * 查询指定用户的点赞列表，返回结构与评论列表类似，
     * 每条记录包含点赞记录的 id、createAt，
     * 以及对应的文章信息（id, title）和文章作者的信息（id, name, avatar）
     */
    @GetMapping("/userLikes")
    public Result<IPage<LikeListDto>> getLikeList(@RequestParam("userId") Integer userId,
                                                  @RequestParam(defaultValue = "1") int pageNum,
                                                  @RequestParam(defaultValue = "100") int pageSize) {
        return usersService.getLikeList(userId, pageNum, pageSize);
    }


    /**
     * 查询指定用户的付费列表，返回结构与评论列表类似，
     * 每条记录包含付费记录的 id、createAt，
     * 以及对应的文章信息（id, title）和文章作者的信息（id, name, avatar）
     */
    @GetMapping("/userPayments")
    public Result<IPage<PaymentListDto>> getPaymentListList(@RequestParam("userId") Integer userId,
                                                  @RequestParam(defaultValue = "1") int pageNum,
                                                  @RequestParam(defaultValue = "100") int pageSize) {
        return usersService.getPaymentList(userId, pageNum, pageSize);
    }



    /**
     * 分页查询用户列表接口，返回用户基本信息及扩展信息
     */
    @GetMapping("/list")
    public Result<IPage<UserListDto>> getUserList(@RequestParam(defaultValue = "1") int pageNum,
                                                  @RequestParam(defaultValue = "10") int pageSize,
                                                  @RequestParam(defaultValue = "") String searchKey) {
        return userService.getUserList(pageNum, pageSize,searchKey);
    }
}
